﻿using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
using System.Drawing;
using System.Drawing.Printing;
using InnvoiceActual.Logica.GestorDB;
using InnvoiceActual.Logica.GestorDB.RemitoDB;
using InnvoiceActual.Logica.GestorObject;
using InnvoiceActual.Logica.GestorObject.Remito;
using System;

namespace InnvoiceActual.Ws.Remitos
{
    /// <summary>
    /// Lógica de interacción para ListadoRemitos.xaml
    /// </summary>
    public partial class ListadoRemitos : Window
    {
        #region Property

        //Variables
        private EmpresaCS empresa = EmpresaCS.Instance;
        private List<Remito> listaRemitos = new List<Remito>();
        private Remito remito_a_imprimir = new Remito();

        private float leftPagePrint = 0;
        private float rightPagePrint = 0;
        private float topPagePrint = 0;
        private float bottomPagePrint = 0;

        //BD
        private RemitoDB remitoDB = new RemitoDB();
        private CabeceraRemitoDB cabeceraDB = new CabeceraRemitoDB();
        private ItemRemitoDB itemsDB = new ItemRemitoDB();
        private PieRemitoDB pieDB = new PieRemitoDB();
        private ClienteDB clienteDB = new ClienteDB();

        private Image imagenFondo = Image.FromFile(@"D:\Documents and Settings\Administrador\Mis documentos\Visual Studio 2010\Projects\Innvoice\trunk\InnvoiceActual\InnvoiceActual\Images\factura_Br1_fondo.jpg");
        private System.Drawing.Point puntoImagenFondo = new System.Drawing.Point(-12,-8);

        #endregion

        #region Contructor

        public ListadoRemitos()
        {
            InitializeComponent();
        }

        #endregion

        #region Windows Methods

        private void btnVolver_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnNuevoRemito_Click(object sender, RoutedEventArgs e)
        {
            NuevoRemito();
        }

        private void btnVerRemito_Click(object sender, RoutedEventArgs e)
        {
            ModificarRemito();
        }

        private void btnImprimirRemito_Click(object sender, RoutedEventArgs e)
        {
            ImprimirRemito();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            CargarRemitos();
        }

        private void Window_Activated(object sender, System.EventArgs e)
        {
            CargarRemitos();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F2":
                    ImprimirRemito();
                    break;
                case "F5":
                    NuevoRemito();
                    break;
                case "F6":
                    ModificarRemito();
                    break;
                case "ESCAPE":
                    this.Close();
                    break;
                default:
                    return;
            }
        }

        private void dgListadoRemitos_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            VerModificarRemito();
        }

        private void radioButtonRemitosPendientes_Click(object sender, RoutedEventArgs e)
        {
            CargarRemitos();
        }

        private void radioButtonRemitosFacturados_Click(object sender, RoutedEventArgs e)
        {
            CargarRemitos();
        }

        #endregion

        #region Auxiliar Methods

        private void NuevoRemito() 
        {
            AltaRemito altaRemito = new AltaRemito();
            altaRemito.Show();
        }

        private void CargarRemitos()
        {

            if (radioButtonRemitosPendientes.IsChecked.Value)
            {
                listaRemitos = remitoDB.ObtenerRemitosParaListar(true);
            }
            else
            {
                listaRemitos = remitoDB.ObtenerRemitosParaListar(false);
            }
            
            IComparer<Remito> comparer = new MyOrderingRemito();

            if (listaRemitos.Count > 0)
            {
                listaRemitos.Sort(comparer);

                dgListadoRemitos.ItemsSource = listaRemitos;
                
            }
            else
            {
                dgListadoRemitos.ItemsSource = new List<Remito>();
            }

            dgListadoRemitos.Items.Refresh();
        }

        private void ModificarRemito()
        {
            if (dgListadoRemitos.SelectedItems.Count == 1)
            {
                Remito auxRemito = (Remito)dgListadoRemitos.SelectedItem;
                Remito remito = ArmarRemito(auxRemito);
                

                VerModificarRemito verModificarRemito = new VerModificarRemito(remito);
                verModificarRemito.Show();
            }
            else if (dgListadoRemitos.SelectedItems.Count < 1)
            {
                MessageBox.Show("Seleccione el elemento a modificar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            else
            {
                MessageBox.Show("Debe seleccionar SOLO UN remito a modificar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void VerModificarRemito()
        {
            Remito auxRemito = (Remito)dgListadoRemitos.SelectedItem;

            Remito remito = ArmarRemito(auxRemito);
            
            VerModificarRemito verModificarRemito = new VerModificarRemito(remito);
            verModificarRemito.Show();
        }

        private void ImprimirRemito()
        {
            //Este método contiene dos componentes muy importantes los cuales son:
            //PrintDocument y printDialog estos métodos definen las propiedades de impresión
            //como son: numero de copias, numero de paginas y seleccionar tipo de impresora

            if (dgListadoRemitos.SelectedItems.Count == 1)
            {
                Remito auxRemito = (Remito)dgListadoRemitos.SelectedItem;
                remito_a_imprimir = ArmarRemito(auxRemito);

            }
            else if (dgListadoRemitos.SelectedItems.Count < 1)
            {
                MessageBox.Show("Seleccione el elemento a IMPRIMIR", "Atencion", MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }
            else
            {
                MessageBox.Show("Debe seleccionar SOLO UN remito a IMPRIMIR", "Atencion", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            string nombreDocumento = "Cliente-" + remito_a_imprimir.Cliente.RazonSocial + "-Remito Nro-" + remito_a_imprimir.NroComprobante1.ToString("D4") 
                + "-" + remito_a_imprimir.NroComprobante2.ToString("D8");

            PrintDocument formulario = new PrintDocument();
            //PaperSize customPaper = new PaperSize("Custom Bruno", 100, 100);
            PaperSize customPaper = new PaperSize("Factura Bruno", 675, 825);
            formulario.DefaultPageSettings.PaperSize = customPaper;
            formulario.PrintPage += new PrintPageEventHandler(Datos_Cliente);
            
            System.Windows.Forms.PrintDialog printDialog1 = new System.Windows.Forms.PrintDialog();
            printDialog1.Document = formulario;
            printDialog1.Document.DocumentName = nombreDocumento;
            
            //printDialog1.PrinterSettings.DefaultPageSettings.PaperSize = customPaper;

           


            //Tamaño A4 --> Alto 296 mm Ancho 210 mm --> Alto 1169 centesimas de pulgadas Ancho 827 centesimas de pulgadas 
            //Tamaño Factura Bruno --> Alto 217 mm Ancho 172 mm --> Alto: 825 centesimas de pulgadas Ancho: 675 centesimas de pulgadas 

            leftPagePrint = printDialog1.Document.DefaultPageSettings.PrintableArea.Left;
            rightPagePrint = printDialog1.Document.DefaultPageSettings.PrintableArea.Right;
            topPagePrint = printDialog1.Document.DefaultPageSettings.PrintableArea.Top;
            bottomPagePrint = printDialog1.Document.DefaultPageSettings.PrintableArea.Bottom;

            string nroRemito = remito_a_imprimir.NroComprobante1.ToString("D4") + " - " + remito_a_imprimir.NroComprobante2.ToString("D8");

            MessageBoxResult resultado = MessageBox.Show("Desea imprimir el Remito: " + nroRemito, "Imprimir", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);
            if (resultado.ToString().ToUpper().Equals("YES"))
            {
                System.Windows.Forms.DialogResult result = printDialog1.ShowDialog();

                if (result.ToString().ToUpper().Equals("OK"))
                {
                    formulario.Print();
                } 
            }
        }

        private void Datos_Cliente(object obj, PrintPageEventArgs ev)
        {
            /**
             * El Limite Horizontal va entre 0 y 810
             * El Limite Vertical va entre 0 y 1150
             * Tengo 7,5 px por caracter
             */

            float left = leftPagePrint;
            float right = rightPagePrint;
            float top = topPagePrint;
            float bottom = bottomPagePrint;

            //Valores para la factura
            string nroRemito = remito_a_imprimir.NroComprobante1.ToString("D4") + "-" + remito_a_imprimir.NroComprobante2.ToString("D8");
            
            string razonSocialCliente = remito_a_imprimir.Cliente.RazonSocial.ToUpper();
            string domicilioCliente = remito_a_imprimir.Cliente.Direccion.ToUpper();
            string localidadCliene = remito_a_imprimir.Cliente.Localidad.ToUpper();
            string fechaRemito = remito_a_imprimir.FechaString;
            string bulto = remito_a_imprimir.Pie.Bulto.ToString();
            string pesokilogramo = remito_a_imprimir.Pie.PesoKilogramo.ToString();
            string viajante = remito_a_imprimir.Pie.Viajante;
            string transporte = remito_a_imprimir.Pie.Transporte;

            TipoContribuyenteDB tipoContribDB = new TipoContribuyenteDB();

            List<TipoContribuyente> tiposDeContribuyentes = tipoContribDB.obtenerTipoContribucion();

            TipoContribuyente tipoContribuyente = tiposDeContribuyentes[remito_a_imprimir.Cliente.NroTipoContrib];

            string descripcionTipoContribuyente = tipoContribuyente.Descripcion;

            string CUIT = remito_a_imprimir.Cliente.Nrocontrib;

            string total = "$"+remito_a_imprimir.Pie.Total.ToString();

            //ev.Graphics.DrawImage(imagenFondo, puntoImagenFondo);

            Font fuenteDatosRemito = new Font("Courier New", 14);

            ev.Graphics.DrawString(nroRemito, fuenteDatosRemito, Brushes.Black, right - 270, top + 65, new StringFormat());
            ev.Graphics.DrawString(fechaRemito, fuenteDatosRemito, Brushes.Black, right - 210, top + 115, new StringFormat());

            Font fuenteCabecera = new Font("Courier New", 10);
            ev.Graphics.DrawString(razonSocialCliente, fuenteCabecera, Brushes.Black, left + 100, top + 215, new StringFormat());
            ev.Graphics.DrawString(domicilioCliente, fuenteCabecera, Brushes.Black, left + 100, top + 245, new StringFormat());
            ev.Graphics.DrawString(localidadCliene, fuenteCabecera, Brushes.Black, right - 200, top + 245, new StringFormat());

            Font fuenteTipoContribuyente = new Font("Courier New", 14, System.Drawing.FontStyle.Bold);
            ev.Graphics.DrawString(descripcionTipoContribuyente, fuenteTipoContribuyente, Brushes.Black, left + 90, top + 285, new StringFormat());
            ev.Graphics.DrawString(CUIT, fuenteTipoContribuyente, Brushes.Black, right - 240, top + 285, new StringFormat());

            int avanceTop = 380;

            Font fuenteItems = new Font("Courier New", 11);

            foreach (ItemRemito item in remito_a_imprimir.Items)
            {
                string cantidad = item.Cantidad.ToString();
                string detalle = item.Descripcion.Replace(" - ", ""); ;
                string precioUnitario = "$" + item.PrecioUnitario.ToString();
                string precioTotal = "$" + item.PrecioTotal.ToString();

                float topeLeft = 45;
                float cantidadCaracteres = 24; //3 caracteres por 8
                float detalleCaracteres = 240; //30 caracteres por 8
                float precioUnitarioCaracteres = 48; //6 caracteres por 8 (3 enteros, la coma, 2 decimales)
                float precioTotalCaracteres = 48; //6 caracteres por 8 (3 enteros, la coma, 2 decimales)

                if ((detalle.Length * 8) > 240)
                {
                    detalle = detalle.Substring(0, 30);
                }

                float avanceLeft = left + topeLeft;
                ev.Graphics.DrawString(cantidad, fuenteItems, Brushes.Black, avanceLeft, top + avanceTop, new StringFormat());

                avanceLeft += cantidadCaracteres + 25;
                ev.Graphics.DrawString(detalle, fuenteItems, Brushes.Black, avanceLeft, top + avanceTop, new StringFormat());

                avanceLeft += (85 + detalleCaracteres);
                ev.Graphics.DrawString(precioUnitario, fuenteItems, Brushes.Black, avanceLeft, top + avanceTop, new StringFormat());

                avanceLeft += (55 + precioUnitarioCaracteres);
                ev.Graphics.DrawString(precioTotal, fuenteItems, Brushes.Red, avanceLeft, top + avanceTop, new StringFormat());

                avanceTop += 27;
            }

            Font fuenteTotal = new Font("Courier New", 14, System.Drawing.FontStyle.Bold);
            ev.Graphics.DrawString(total, fuenteTotal, Brushes.Red, right - 170, bottom - 85, new StringFormat());

            Font fuentePieRemito = new Font("Courier New", 10);
            ev.Graphics.DrawString("Bulto: " + bulto, fuentePieRemito, Brushes.Black, left + 40, bottom - 90, new StringFormat());
            ev.Graphics.DrawString("Peso: " + pesokilogramo, fuentePieRemito, Brushes.Black, left + 130, bottom - 90, new StringFormat());
            ev.Graphics.DrawString("Viajante: " + viajante, fuentePieRemito, Brushes.Black, left + 40, bottom - 70, new StringFormat());
            ev.Graphics.DrawString("Transporte: " + transporte, fuentePieRemito, Brushes.Black, left + 210, bottom - 70, new StringFormat());
        }

        private Remito ArmarRemito(Remito auxRemito)
        {

            Remito remito = remitoDB.ObtenerRemitoPorCodigo((short)auxRemito.NroComprobante1, auxRemito.NroComprobante2, auxRemito.CodigoTipo);
            remito.Cabecera = cabeceraDB.ObternerCabeceraSegunCodigo((short)remito.NroComprobante1, remito.NroComprobante2, remito.CodigoTipo);

            remito.Cliente = clienteDB.ObtenerClientePorCodigo(remito.Cabecera.NroCliente);

            remito.Items = itemsDB.ObternerItemsSegunCodigo((short)remito.NroComprobante1, remito.NroComprobante2, remito.CodigoTipo);

            remito.Pie = pieDB.ObtenerPieSegunCodigo((short)remito.NroComprobante1, remito.NroComprobante2, remito.CodigoTipo);

            return remito;
        }

        #endregion

        

        
    }
}
